package com.zzx.demo.dao;

import java.io.UnsupportedEncodingException;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.ibatis.session.SqlSession;

import com.ai.frame.util.ConvertUtil;


public class BaseDaoImpl implements IBaseDao{

	private SqlSession sqlSession;
	
	public SqlSession getSqlSession() {
		return sqlSession;
	}

	public void setSqlSession(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
	}

	/**
	 * 根据Id获取对象
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param id
	 *            主键
	 * @return Object对象
	 */
	public Object queryForObject(String sqlId, int id) {
		return getSqlSession().selectOne(sqlId, id);
	}

	/**
	 * 根据Id获取对象
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param id
	 *            主键
	 * @param cls
	 *            返回的对象Class
	 * @return cls对应的类
	 */
	@SuppressWarnings("unchecked")
	public <T> T queryForObject(String sqlId, int id, Class<T> cls) {
		return (T) getSqlSession().selectOne(sqlId, id);
	}

	/**
	 * 根据条件获取对象
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param params
	 *            参数
	 * @return
	 */
	public Object queryForObject(String sqlId, Map<String, String> params) {
		return getSqlSession().selectOne(sqlId, params);
	}

	/**
	 * 根据条件获取对象
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param params
	 *            参数
	 * @param cls
	 *            返回的对象Class
	 * @return cls对应的类
	 */
	@SuppressWarnings("unchecked")
	public <T> T queryForObject(String sqlId, Map<String, String> params,
			Class<T> cls) {
		return (T) getSqlSession().selectOne(sqlId, params);
	}

	/**
	 * 获取数据总条数
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param params
	 *            参数
	 * @return 条数
	 */
	public int getTotalCount(String sqlId, Map<String, String> params) {
		return (Integer) getSqlSession().selectOne(sqlId, params);
	}

	/**
	 * 查询列表
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param params
	 *            参数
	 * @param cls
	 *            返回的对象Class
	 * @return 列表<cls对应的类>
	 */
	public <T> List<T> queryForList(String sqlId, Map<String, String> params,
			Class<T> cls) {
		return getSqlSession().selectList(sqlId, params);
	}

	/**
	 * 查询列表
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param params
	 *            参数
	 * @return 列表
	 */
	public List<Map<String, String>> queryForList(String sqlId,
			Map<String, String> param) {
		List<Map<String, Object>> list = getSqlSession().selectList(sqlId, param);
		return convertSqlMap2JavaMap(list);
	}
	
	private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private static final char[] HEXCHAR = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c',
			'd', 'e', 'f'};
	
	public static List<Map<String, String>> convertSqlMap2JavaMap(List<Map<String, Object>> list) {
		ArrayList beans = new ArrayList();

		try {
			Iterator var2 = list.iterator();

			while (var2.hasNext()) {
				Map<String, Object> map = (Map) var2.next();
				Map<String, String> bean = new HashMap();
				Iterator iter = map.entrySet().iterator();

				while (iter.hasNext()) {
					Entry entry = (Entry) iter.next();
					Object key = entry.getKey();
					Object val = entry.getValue();
					if (val == null) {
						bean.put(key.toString(), "");
					} else {
						//String val;
						if (val instanceof Date) {
							val = dateFormat.format(val);
							bean.put(key.toString(), val.toString());
						} else if (val instanceof Clob) {
							try {
								val = clobToString((Clob) val);
								bean.put(key.toString(), val.toString());
							} catch (Exception var12) {
								System.err.println("convertSqlMap2JavaMap clobToString"+ var12);
							}
						} else if (val instanceof Blob) {
							try {
								val = blobToString((Blob) val);
								bean.put(key.toString(), val.toString());
							} catch (Exception var11) {
								System.err.println("convertSqlMap2JavaMap blobToString"+var11);
							}
						} else if (val.getClass() == byte[].class) {
							try {
								val = new String((byte[]) ((byte[]) val), "UTF-8");
								bean.put(key.toString(), val.toString());
							} catch (UnsupportedEncodingException var10) {
								System.err.println("convertSqlMap2JavaMap byte[]ToString"+var10);
							}
						} else if (val instanceof Byte) {
							val = val.toString();
							bean.put(key.toString(), val.toString());
						} else {
							val = String.valueOf(val);
							bean.put(key.toString(), val.toString());
						}
					}
				}

				beans.add(bean);
			}
		} catch (Exception var13) {
			System.err.println("convertSqlMap2JavaMap"+ var13);
		}

		return beans;
	}
	
	public static String clobToString(Clob val) throws Exception {
		return "";
	}
	public static String blobToString(Blob blob) throws Exception {
		byte[] returnValue = blob.getBytes(1L, (int) blob.length());
		return bytes2String(returnValue);
	}
	public static String bytes2String(byte[] bytes) {
		StringBuilder builder = new StringBuilder(bytes.length * 2);

		for (int i = 0; i < bytes.length; ++i) {
			builder.append(HEXCHAR[(bytes[i] & 240) >>> 4]);
			builder.append(HEXCHAR[bytes[i] & 15]);
		}

		return builder.toString();
	}
	/**
	 * 查询列表
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param params Map<String,Object>
	 *            参数
	 * @return 列表
	 */
	public List<Map<String, String>> queryForList(String sqlId, Object param) {
		List<Map<String, Object>> list = getSqlSession().selectList(sqlId, param);
		return ConvertUtil.convertSqlMap2JavaMap(list);
	}
	
	/**
	 * 修改数据
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param object
	 *            对象
	 * @return 修改的行数
	 */
	public int update(String sqlId, Object object) {
		return getSqlSession().update(sqlId, object);
	}

	/**
	 * 插入数据
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param object
	 *            待插入的对象
	 * @return 插入条数
	 */
	public int insert(String sqlId, Object object) {
		return (Integer) getSqlSession().insert(sqlId, object);
	}

	/**
	 * 删除数据
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param id
	 *            主键
	 * @return 主键
	 */
	public int delete(String sqlId, int id) {
		return getSqlSession().delete(sqlId, id);
	}
	
	/**
	 * 删除数据
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param map
	 *            待删除的对象
	 * @return 主键
	 */
	public int delete(String sqlId, Map<String, String> map) {
		return getSqlSession().delete(sqlId, map);
	}
	
	/**
	 * 根据条件获取对象
	 * 
	 * @param sqlId
	 *            脚本编号
	 * @param params
	 *            参数
	 * @return
	 */
	@Override
	public Object queryForObject(String sqlId, Object params) {
		return getSqlSession().selectOne(sqlId, params);
	}

}
